www.gusucode.com > VC++ 增强版CListCtrl控件(可日历选择、下拉列表、编辑等)-源码 > VC++ 增强版CListCtrl控件(可日历选择、下拉列表、编辑等)-源码程序/code/TestList6View.cpp
// TestList6View.cpp : implementation of the CTestList6View class // Downloload by http://www.NewXing.com #include "stdafx.h" #include "TestList6.h" #include "TestList6Doc.h" #include "TestList6View.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CTestList6View IMPLEMENT_DYNCREATE(CTestList6View, CView) BEGIN_MESSAGE_MAP(CTestList6View, CView) //{{AFX_MSG_MAP(CTestList6View) ON_WM_SIZE() ON_WM_CREATE() ON_WM_DESTROY() ON_COMMAND(ID_VIEW_REFRESH, OnViewRefresh) ON_COMMAND(ID_VIEW_LINEUP, OnViewLineup) //}}AFX_MSG_MAP // Standard printing commands ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview) ON_COMMAND_RANGE(AFX_ID_VIEW_MINIMUM, AFX_ID_VIEW_MAXIMUM, OnListStyle) ON_UPDATE_COMMAND_UI_RANGE(AFX_ID_VIEW_MINIMUM, AFX_ID_VIEW_MAXIMUM, OnUpdateListStyles) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CTestList6View construction/destruction CTestList6View::CTestList6View() { // TODO: add construction code here } CTestList6View::~CTestList6View() { } BOOL CTestList6View::PreCreateWindow(CREATESTRUCT& cs) { // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs return CView::PreCreateWindow(cs); } ///////////////////////////////////////////////////////////////////////////// // CTestList6View drawing void CTestList6View::OnDraw(CDC* pDC) { CTestList6Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here } ///////////////////////////////////////////////////////////////////////////// // CTestList6View printing BOOL CTestList6View::OnPreparePrinting(CPrintInfo* pInfo) { // default preparation return DoPreparePrinting(pInfo); } void CTestList6View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: add extra initialization before printing } void CTestList6View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: add cleanup after printing } ///////////////////////////////////////////////////////////////////////////// // CTestList6View diagnostics #ifdef _DEBUG void CTestList6View::AssertValid() const { CView::AssertValid(); } void CTestList6View::Dump(CDumpContext& dc) const { CView::Dump(dc); } CTestList6Doc* CTestList6View::GetDocument() // non-debug version is inline { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CTestList6Doc))); return (CTestList6Doc*)m_pDocument; } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CTestList6View message handlers int CTestList6View::OnCreate(LPCREATESTRUCT lpCreateStruct) { if(CView::OnCreate(lpCreateStruct) == -1)return -1; // TODO: Add your specialized creation code here DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_TABSTOP | CS_DBLCLKS | LVS_REPORT; BOOL bResult = m_List.Create(dwStyle,CRect(0,0,0,0),this,IDC_LIST); m_List.PreSubclassWindow(); return bResult ? 0 : -1; // return 0; } void CTestList6View::OnDestroy() { CView::OnDestroy(); // TODO: Add your message handler code here m_List.SaveState(); } void CTestList6View::OnSize(UINT nType, int cx, int cy) { CView::OnSize(nType, cx, cy); // TODO: Add your message handler code here if(::IsWindow(m_List.m_hWnd))m_List.MoveWindow(0,0,cx,cy,TRUE); } void CTestList6View::OnInitialUpdate() { CView::OnInitialUpdate(); // TODO: Add your specialized code here and/or call the base class if(! m_List.GetItemCount()) { m_pFont = m_List.GetFont(); CRect Rect(CPoint(0,0),CSize(100,500)); m_DT.Create(WS_CHILD | WS_TABSTOP, Rect, this, IDC_DATE); m_Combo.Create(WS_CHILD | WS_TABSTOP | CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | CBS_AUTOHSCROLL,Rect,this,IDC_COMBO); m_Edit.Create(WS_CHILD | WS_TABSTOP | WS_BORDER,Rect,this,IDC_EDIT); m_Combo.AddString("Test 1"); m_Combo.AddString("Test 2"); m_Combo.AddString("Test 3"); m_Combo.AddString("Test 4"); m_Combo.AddString("Test 5"); m_Combo.AddString("Test 6"); m_Combo.AddString("Test 7"); m_Combo.AddString("Test 8"); m_Combo.AddString("Test 9"); m_Edit.SetFont(m_pFont); m_Combo.SetFont(m_pFont); } m_List.SetGridBehaviour(); m_List.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_HEADERDRAGDROP | LVS_EX_INFOTIP); m_List.DeleteAllColumns(); m_List.InsertColumn(0, "Integer", LVCFMT_LEFT, 100); m_List.InsertColumn(1, "String", LVCFMT_LEFT, 100); m_List.InsertColumn(2, "List", LVCFMT_LEFT, 100); m_List.InsertColumn(3, "DateTime", LVCFMT_LEFT, 100); m_List.InsertColumn(4, "Random", LVCFMT_LEFT, 100); m_List.SetColumnEditor(2, &CTestList6View::InitEditor, &CTestList6View::EndEditor, &m_Combo); m_List.SetColumnEditor(3, &CTestList6View::InitEditor, &CTestList6View::EndEditor, &m_DT); m_List.SetColumnSorting(0, CListCtrlExt::Auto, CListCtrlExt::Int); m_List.SetColumnSorting(1, CListCtrlExt::Auto, CListCtrlExt::StringNoCase); m_List.SetColumnSorting(2, CListCtrlExt::Auto, CListCtrlExt::StringNoCase); m_List.SetColumnSorting(3, CListCtrlExt::Auto, CListCtrlExt::Date); m_List.SetColumnSorting(4, CListCtrlExt::Auto, CListCtrlExt::StringNoCase); PopulateList(); m_List.GetHeaderCtrl()->SetRemovable(0,FALSE); m_List.RestoreState(); } void CTestList6View::PopulateList() { int nIndex = -1; CString sDate = COleDateTime(CTime::GetCurrentTime().GetTime()).Format(); m_List.DeleteAllItems(); for(int i = 0;i < 10;++i) { CString sTemp; sTemp.Format("%d",i * 100); nIndex = m_List.InsertItem(i, sTemp); if(i % 4)m_List.SetItemText(i, 1, "Test string"); else m_List.SetItemText(i, 1, "Lorepsum ipsum"); m_List.SetItemText(i, 2, "Choose value from ComboBox"); if(i % 3)m_List.SetItemText(i, 3, "31/12/2008"); else m_List.SetItemText(i, 3,sDate); sTemp.Format(_T("%04X"),rand() % 0x10000); m_List.SetItemText(i, 4, sTemp); if(i % 3) { m_List.SetCellEditor(i,4,&m_Edit); m_List.SetCellColors(i,4,RGB(230,255,230),-1); } m_List.SetItemData(nIndex,nIndex + 1000); } m_List.SetColumnColors(2,-1,RGB(0,180,0)); m_List.SetColumnColors(3,RGB(200,255,200),-1); m_List.SetCellReadOnly(7,3); m_List.SetCellColors(7,3,RGB(255,255,255),-1); m_List.SetCellColors(3,0,-1,RGB(0,0,255)); } void CTestList6View::RefreshList() { m_List.SetRedraw(FALSE); PopulateList(); m_List.SortOnColumn(m_List.GetColumnSort()); m_List.SetRedraw(); m_List.Invalidate(FALSE); } BOOL CTestList6View::InitEditor(CWnd** pWnd, int nRow, int nColumn, CString &strSubItemText, DWORD_PTR dwItemData, void* pThis, BOOL bUpdate) { ASSERT(*pWnd); switch(nColumn) { case 2: { CComboBox* pCmb = reinterpret_cast<CComboBox*>(*pWnd); pCmb->SelectString(0, strSubItemText); } break; case 3: { CDateTimeCtrl* pDTC = reinterpret_cast<CDateTimeCtrl*>(*pWnd); COleDateTime dt; if(dt.ParseDateTime(strSubItemText))pDTC->SetTime(dt); } break; } return TRUE; } BOOL CTestList6View::EndEditor(CWnd** pWnd, int nRow, int nColumn, CString &strSubItemText, DWORD_PTR dwItemData, void* pThis, BOOL bUpdate) { ASSERT(pWnd); switch(nColumn) { case 2: { CComboBox* pCmb = reinterpret_cast<CComboBox*>(*pWnd); int index = pCmb->GetCurSel(); if(index >= 0) pCmb->GetLBText(index, strSubItemText); } break; case 3: { CDateTimeCtrl* pDTC = reinterpret_cast<CDateTimeCtrl*>(*pWnd); COleDateTime dt; pDTC->GetTime(dt); strSubItemText = dt.Format(); } break; } return TRUE; } void CTestList6View::OnListStyle(UINT nCommandID) { DWORD dwStyle = -1; switch (nCommandID) { // other commands change the style on the list control case ID_VIEW_DETAILS: dwStyle = LVS_REPORT; break; case ID_VIEW_SMALLICON: dwStyle = LVS_SMALLICON; break; case ID_VIEW_LARGEICON: dwStyle = LVS_ICON; break; case ID_VIEW_LIST: dwStyle = LVS_LIST; break; case ID_VIEW_LINEUP: m_List.Arrange(LVA_SNAPTOGRID); break; } // change the style; window will repaint automatically if(dwStyle != -1)m_List.ModifyStyle(LVS_TYPEMASK, dwStyle); if(dwStyle == LVS_REPORT)m_List.SetGridBehaviour(); else m_List.SetGridBehaviour(FALSE); } void CTestList6View::OnUpdateListStyles(CCmdUI* pCmdUI) { // TODO: customize or extend this code to handle choices on the // View menu. BOOL bChecked = FALSE; DWORD dwStyle = m_List.GetStyle() & LVS_TYPEMASK; if(pCmdUI->m_nID == ID_VIEW_LINEUP) { if(dwStyle == LVS_ICON || dwStyle == LVS_SMALLICON)pCmdUI->Enable(); else pCmdUI->Enable(FALSE); } else { switch (pCmdUI->m_nID) { case ID_VIEW_DETAILS: bChecked = (dwStyle == LVS_REPORT); break; case ID_VIEW_SMALLICON: bChecked = (dwStyle == LVS_SMALLICON); break; case ID_VIEW_LARGEICON: bChecked = (dwStyle == LVS_ICON); break; case ID_VIEW_LIST: bChecked = (dwStyle == LVS_LIST); break; default: bChecked = FALSE; break; } pCmdUI->SetRadio(bChecked ? 1 : 0); } } void CTestList6View::OnViewRefresh() { // TODO: Add your command handler code here RefreshList(); } void CTestList6View::OnViewLineup() { // TODO: Add your command handler code here m_List.Arrange(LVA_DEFAULT); }